<?php

require_once(FWK_EXCEPTION."CustonException.class.php");
require_once(BIB_ACTIVE_RECORD);
require_once(FWK_MODEL."AbsModelDao.class.php");
/**
 * Classe modelo para a estrutura da sessão do usuario que estiver logado
 *
 * @author Matheus Vieira <matheus@magle.com.br>
 * @since 1.0 - 23/07/2011
 */
class Usuario extends AbsModelDao{

	public $_table = "usuario";

	public $_id = "id_usuario";

	private $_dataLogin;
	private $_ipUsr;
	private $_strHostRemoto;
	private $_campoSessao;

	public function getCampoSessaoOrdenacao(){
		return $this->_campoSessao;
	}
	public function setCampoSessaoOrdenacao($campoSessao){
		$this->_campoSessao = "order_".$campoSessao;
	}
	
	public function getIdUsuario(){
		return $this->id_usuario;
	}
	public function setIdUsuario($idUser){
		$this->id_usuario = $idUser;
	}


	public function getIdTipoUsuario(){
		return $this->_strTipoIdUsr;
	}
	public function setIdTipoUsuario($idTipoUser){
		$this->_strTipoIdUsr = $idTipoUser;
	}

	public function getNomeUsuario(){
		return utf8_encode($this->nome_usuario);
	}
	public function setNomeUsuario($nomeUser){
		$this->nome_usuario = $nomeUser;
	}

	public function getDataLogin(){
		return $this->_dataLogin;
	}
	public function setDataLogin($datLogin){
		$this->_dataLogin = $datLogin;
	}

	public function getIpUsuario(){
		return $this->_ipUsr;
	}
	public function setIpUsuario($strIp){
		$this->_ipUsr = $strIp;
	}

	public function getHostUsuario(){
		return $this->_strHostRemoto;
	}
	public function setHostUsuario($strHost){
		$this->_strHostRemoto = $strHost;
	}

	public function getEmailUser(){
		return $this->email_usuario;
	}
	public function setEmailUser($strEmail){
		$this->email_usuario = $strEmail;
	}

	public function getGrupoUsuario(){
		return $this->grupo_usuario;
	}
	public function setGrupoUsuario($intGrupo){
		$this->grupo_usuario = $intGrupo;
	}

	public function getUltimoAcesso(){
		return $this->ultimo_acesso;
	}
	public function setUltimoAcesso($datAcesso){
		$this->ultimo_acesso = $datAcesso;
	}

	public function getIdEncontro(){
		return $this->id_encontro;
	}
	public function setIdEncontro($idEncontro){
		$this->id_encontro = $idEncontro;
	}
	public function getIdEquipe(){
		return $this->id_equipe;
	}
	public function setIdEquipe($idEquipe){
		$this->id_equipe = $idEquipe;
	}

	public function verUserVisit(){
		if($this->id_usuario == "000" && $this->nome_usuario = "Visitante")
			return false;
		return true;
	}


	/**
	 * Seta um objeto usuário a partir dos dados vindos do banco de dados
	 *
	 * @author Matheus Vieira
	 * @since 1.0 - 05/07/2008
	 * @param Array arrDados vetor com os dados do usuário vindo do banco de dados
	 */
	public function setObjUsuario($arrDados){
		self::setIdUsuario($arrDados["id_usuario"]);
		self::setNomeUsuario($arrDados["nome_usuario"]);
		self::setEmailUser($arrDados["email_usuario"]);
		self::setIpUsuario($_SERVER["REMOTE_ADDR"]);
		self::setHostUsuario($_SERVER["REMOTE_HOST"]);
		self::setGrupoUsuario($arrDados["grupo_usuario"]);
		self::setUltimoAcesso($arrDados["ultimo_acesso"]);
		self::setIdEncontro($arrDados["id_encontro"]);
		self::setIdEquipe($arrDados["id_equipe"]);
		self::setDataLogin(time());
	}

	/**
	 * Método para verificar a existencia de um usuário por login no banco de dados
	 *
	 * @author Matheus Vieira <matheus@magle.com.br>
	 * @since 1.0 - 23/07/2011
	 * @param String $strLogin: login do usuario
	 * @param String $strPassw: senha do usuario
	 */
	public function validaUsuarioDB($strLogin,$strPassw){
		if(strpos($strLogin,"@") === false){
			$campoLogin = "usuario_usuario = '".$strLogin."'";
		}else{
			$campoLogin = "email_usuario = '".$strLogin."'";
		}
		
		$strQuery = "SELECT * FROM usuario where ".$campoLogin." AND ".
				" senha_usuario = '".base64_encode(md5($strPassw))."' ";
		$arrRet = ControlDB::getRow($strQuery,0);
		if(!isset($arrRet["id_usuario"]) && count($arrRet)<5 ){
			return "2||Usuário e/ou Senha Inválidos!";
		}
		self::setObjUsuario($arrRet);
		self::registraAcesso($arrRet["id_usuario"]);
		return $arrRet;
	}

	/**
	 * Método para verificar a existencia de um usuário logado no FB no banco de dados
	 *
	 * @author Matheus Vieira <matheus@magle.com.br>
	 * @since 1.0 - 20/04/2013
	 * @param String $strLogin: email do usuario
	 */
	public function verificaUsuarioFb($strEmail){
		$strQuery = "SELECT * FROM usuario where email_usuario = '".$strEmail."'";
		$arrRet = ControlDB::getRow($strQuery,0);
		//se ainda não tem o usuário cadastrado no banco retorna false para poder inserí-lo
		if(!isset($arrRet["id_usuario"]) && count($arrRet)<5 ){
			return false;
		}
		self::setObjUsuario($arrRet);
		self::registraAcesso($arrRet["id_usuario"]);
		return $arrRet;
	}

	public function salvaUsuarioFb($objUserFb){
		$strQuery = "
		INSERT INTO `usuario`
            (`nome_usuario`,
             `usuario_usuario`,
             `email_usuario`,
             `senha_usuario`,
             `veio_facebook`,
             `data_cadastro`)
		VALUES ('".$objUserFb->name."',
		        '".$objUserFb->username."',
		        '".$objUserFb->email."',
		        '".base64_encode(md5($objUserFb->username))."',
		        '1',
		        CURDATE());";
		if(!ControlDB::getBanco()->Execute($strQuery)){
			return false;
		}else{
			return self::verificaUsuarioFb($objUserFb->email);
		}
	}
	
	public function registraAcesso($idUsuario){
		$strQuery = "UPDATE usuario
		SET ultimo_acesso = '".date("Y-m-d H:i:s")."'
		WHERE id_usuario = '".$idUsuario."'";
		return ControlDB::getBanco()->Execute($strQuery);
	}

	public function salvaCookie($idUsuario, $cookie){
		$strQuery = "UPDATE usuario
		SET cookie = '".$cookie."'
		WHERE id_usuario = '".$idUsuario."'";
		return ControlDB::getBanco()->Execute($strQuery);
	}

	public function validaCookie($idUsuario, $cookie){
		$strQuery = "SELECT * FROM usuario WHERE id_usuario = '".$idUsuario."' AND cookie = '".$cookie."' AND cookie != ''";
		$arrRet = ControlDB::getRow($strQuery,0);
		if(!empty($arrRet)){
			self::setObjUsuario($arrRet);
			self::registraAcesso($arrRet["id_usuario"]);
			return $arrRet;
		}else{
			return false;
		}
	}

	public function validaEmailDB($strEmail){
		$strQuery = "SELECT * FROM usuario WHERE email_usuario = '".$strEmail."'";
		$arrRet = ControlDB::getRow($strQuery,0);
		if(!isset($arrRet["id_usuario"]) && count($arrRet)<5 ){
			throw new CustonException("Ja existe este usuário com esse email cadastrado no sistema");
			return false;
		}else{
			$objUsuario["email_usuario"] = $arrRet["email_usuario"];
			$objUsuario["nome_usuario"]  = $arrRet["nome_usuario"];
			return $objUsuario;
		}
	}

	public function salvaSenhaDB($strPassw, $strEmail){
		$strQuery = "UPDATE usuario
		SET senha_usuario = '".base64_encode(md5($strPassw))."'
		WHERE email_usuario = '".$strEmail."'";
		$arrRet = ControlDB::getRow($strQuery,0);
		return "salvo";
	}

	public function getListaUsuarios(){
		$strQuery = "SELECT
		id_usuario, nome_usuario, email_usuario,
		senha_usuario, grupo_usuario, data_cadastro,
		ultimo_acesso
		FROM
		usuario
		WHERE
		id_usuario != 1
		ORDER BY
		nome_usuario";
		$arrRet = ControlDB::getAll($strQuery,3);
		return $arrRet;
	}

	public function getOptionsUsuarios(){
		$strQuery = "SELECT
		id_usuario AS 'value', nome_usuario AS 'text'
		FROM
		usuario
		WHERE
		id_usuario != 1
		ORDER BY
		nome_usuario";
		$arrRet = ControlDB::getAll($strQuery,0);
		return $arrRet;
	}

	public function getListaRegistros($intPag, $busca = null){
		//trata a busca caso a tenha
		$arrBusca = parent::trataBusca($busca);
		$inicio = ((int)$intPag) * NUM_ELEMENTOS_GRID;

		$strQuery = "SELECT
		c.id_usuario, c.nome_usuario, c.usuario_usuario AS 'username'
		FROM
		usuario c 
		WHERE id_usuario != 1 ";
		if(count($arrBusca)>0){
			$strQuery .= " AND ";
			for($i=0; $i<count($arrBusca); $i++){
				$strQuery .= ($i == 0)?"(":"";

				$strQuery .= " c.nome_usuario LIKE '%".$arrBusca[$i]."%' OR c.usuario_usuario LIKE '%".$arrBusca[$i]."%' ";

				$strQuery .= ($i != count($arrBusca)-1)?" OR ":")";
			}
		}
		$strQuery .= " ORDER BY ".self::getOrdenacao()." LIMIT ".$inicio.", ".NUM_ELEMENTOS_GRID;
		$arrRet = ControlDB::getAll($strQuery,0);
		return $arrRet;
	}

	public function getCountListaRegistros($busca=null){
		//trata a busca caso a tenha
		$arrBusca = parent::trataBusca($busca);

		$strQuery = "SELECT
		COUNT(*)
		FROM
		usuario c ";
		if(count($arrBusca)>0){
			$strQuery .= " WHERE ";
			for($i=0; $i<count($arrBusca); $i++){
				$strQuery .= ($i == 0)?"(":"";

				$strQuery .= " c.nome_usuario LIKE '%".$arrBusca[$i]."%' OR c.usuario_usuario LIKE '%".$arrBusca[$i]."%' ";

				$strQuery .= ($i != count($arrBusca)-1)?" OR ":")";
			}
		}

		$arrRet = end(ControlDB::getRow($strQuery,0));
		return $arrRet;
	}
	
	
	private function getOrdenacao(){
		if(isset($_SESSION[self::getCampoSessaoOrdenacao()])){
			switch ($_SESSION[self::getCampoSessaoOrdenacao()]){
				case "usuario_usuario":
					$ordenacao = "c.usuario_usuario";
					break;
				case "nome_usuario":
				default:
					$ordenacao = "c.nome_usuario";
					break;
			}
		}else{
			$_SESSION[self::getCampoSessaoOrdenacao()] = "nome_usuario";
			$ordenacao = "c.nome_usuario";
		}
	
		return $ordenacao;
	}

	public function alterar($id=null,$post,$file){
		try{
			self::salvaPostAutoUtf8($post);
				
			$this->id_usuario = $id;
			$this->ultimo_acesso = null;
				
			self::replace();
			if(self::ErrorMsg()){
				print("<pre>");
				print_r($post);
				die("<br/><br /><h1>".self::ErrorMsg()."</h1>");
			}
		}catch(DaoException $e){
			throw new CustonException($e->getMensagem());
		}
	}
}
?>